#include "sort.h"
#include "structure_sort.h"

template <class T, class compare>
void sort_test(std::vector<T> v, compare comp)
{

    std::sort(v.begin(), v.end(), comp);
    for (auto e : v)
    {
        std::cout << e << "\t";
    }
    std::cout << std::endl;
}

template <class T>
void work()
{
    std::size_t n = 0;
    std::cout << "需要对多少数进行排序：";
    std::cin >> n;
    std::cout << "请输入 " << n << " 个 \n"
              << (std::is_same_v<T, int> ? "int" : std::is_same_v<T, double> ? "double"
                                                                             : "string")
              << " 类型数据：\n";
    auto v = xsz::readVector<T>(n);

    int m = 0;
    std::cout << "升序输入 1，降序输入 2：";
    while (std::cin >> m)
    {
        /*快排排序*/

        // if (m == 1)
        // {
        //     xsz::MySort<T, xsz::less<T>> sorter(v);
        //     sorter.sort();
        //     const auto &res = sorter.result();
        //     std::cout << "升序结果：";
        //     for (const auto &x : res)
        //         std::cout << x << ' ';
        //     std::cout << '\n';
        //     return;
        // }
        // else if (m == 2)
        // {
        //     xsz::MySort<T, xsz::greater<T>> sorter(v);
        //     sorter.sort();
        //     const auto &res = sorter.result();
        //     std::cout << "降序结果：";
        //     for (const auto &x : res)
        //         std::cout << x << ' ';
        //     std::cout << '\n';
        //     return;
        // }
        // else
        // {
        //     std::cout << "输入错误，请重新输入 1 或 2：";
        // }
        /*multiset排序*/
        std::vector<T> res;
        if (m == 1)
        {
            res = xsz::set_sort<T>(v).order_result();
            std::cout << "库函数排序：" << std::endl;
            sort_test(v, xsz::less<T>());
        }
        else if (m == 2)
        {
            res = xsz::set_sort<T>(v).desc_result();
            std::cout << "库函数排序：" << std::endl;
            sort_test(v, xsz::greater<T>());
        }
        else
        {
            std::cout << "输入错误，请重新输入 1 或 2：";
            continue;
        }
        std::cout << (m == 1 ? "升序结果：\n" : "降序结果：\n");
        for (const auto &x : res)
            std::cout << x << '\t';
        std::cout << '\n';

        return;
    }
}
int main()
{
    // sort_int();
    // sort_float();

    // test_set_int();
    // test_set_double();

    int type = 0;
    std::cout << "请选择数据类型：1=int  2=double  3=string\n";
    while (std::cin >> type)
    {
        switch (type)
        {
        case 1:
            work<int>();
            return 0;
        case 2:
            work<double>();
            return 0;
        case 3:
            work<std::string>();
            return 0;
        default:
            std::cout << "输入错误，请重新选择 1/2/3：";
        }
    }
    return 0;
}